home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
090
/
pctjsp86.arc
/
SCROLLER.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-05-07
|
3KB
|
99 lines
; Resident program to provide flicker-free write_tty scroll for Color
; Graphics Adapter clones with dual-ported memory. M. Abrash 5/3/86.
; Make runnable with MASM-LINK-EXE2BIN.
cseg segment
assume cs:cseg
org 100h ;necessary for COM file
start proc near
jmp makeres
old_int10 dd ?
; front end routine for BIOS video handler to scroll without flicker
scroll_front_end:
cmp ax,0e0ah ;only intercept write_tty function
jnz pass_to_bios ; called with linefeed
push ax
push bx
mov ah,0fh
int 10h ;get current page & mode
cmp al,2
jz check_row ;BIOS only blanks in modes 2 & 3, so
cmp al,3 ; only intercept linefeed scroll in
jnz pass_to_bios2 ; modes 2 & 3
check_row: ;see if cursor is on bottom row, in
push cx ; which case linefeed causes scroll
push dx
mov ah,3
int 10h ;get cursor location in current page
cmp dh,24
jnz pass_to_bios3 ;cursor not on bottom row, no scroll
push ds ;meets all the criteria, so perform
push es ; scroll in current page with special
push si ; routine that doesn't disable video
push di
mov ah,0fh
int 10h ;get # columns & page
mov al,ah
sub ah,ah ;convert to word
push ax ;set aside # columns
mov si,ax
shl si,1 ;move from second row (each character=2 bytes)
mov ah,24
mul ah ;# words to move (24 rows)
mov cx,ax
sub ax,ax ;now adjust offsets for current page
mov ds,ax ;buffer length is stored in BIOS segment
mov al,bh ;get current page
mul word ptr ds:[44ch] ;offset of start of current page
add si,ax ;move data from second row of current page
mov di,ax ; to top of current page
mov ax,0b800h
mov ds,ax
mov es,ax ;will move data in display segment
cld
rep movsw ;scroll screen up
mov ah,8 ;BH already has current page
int 10h ;get attribute of character at cursor
mov al,' ' ;fill with blanks & attribute just obtained
pop cx ;# of words per row
rep stosw ;blank bottom row-DI points to bottom row
pop di ;done
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
iret
pass_to_bios3:
pop dx
pop cx
pass_to_bios2:
pop bx
pop ax
pass_to_bios: ;pass interrupt to normal BIOS handler
jmp cs:[old_int10]
endres:
; make scroll front end handler resident & revector interrupt 10 to it
makeres:
push cs
pop ds
assume ds:cseg
mov ax,3510h ;DOS get vector function, vector 10h
int 21h ;get vector 10h
mov word ptr [old_int10],bx ;set aside old vector to
mov word ptr [old_int10+2],es ; allow pass to BIOS
mov ax,2510h ;DOS set vector function, vector 10h
mov dx,offset scroll_front_end ;revector interrupt
int 21h ; 10h to front end routine
mov dx,offset endres ;# of paragraphs to make
mov cl,4 ; resident-can't do with an
shr dx,cl ; expression because assembler can't
inc dx ; calculate w/relocatable label
mov ax,3100h ;DOS make resident fn, exit code=0
int 21h ;terminate & stay resident
start endp
cseg ends
end start